/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ModeloLogicoSistema;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author Veko
  */
public class RespaldoBD {

    // private File ruta_destino = null;
    File respaldo = null;
    File archivo;
    String ruta_postgresBackup = "\""+System.getenv("ProgramFiles")+"\\PostgreSQL\\9.3\\bin\\pg_dump.exe\"";
    String ruta_postgresRestore = "\""+System.getenv("ProgramFiles")+"\\PostgreSQL\\9.3\\bin\\pg_restore.exe\"";
    //String rutaB,rutaR;
    String ruta_respaldo;
    SimpleDateFormat formateador;
    
    private void buscarRutaRespaldo(){
       ruta_respaldo=new File(".").getAbsolutePath();
       
       while(!ruta_respaldo.endsWith("SistemaLavanderia")){
            ruta_respaldo=new File(".").getAbsolutePath().replace("\\.", "");   
        }
    }
    
    public RespaldoBD() {
        
        formateador = new SimpleDateFormat("dd.MM.yyyy");
        ruta_postgresBackup = "\""+System.getenv("ProgramFiles")+"\\PostgreSQL\\9.3\\bin\\pg_dump.exe\"";
        ruta_postgresRestore = "\""+System.getenv("ProgramFiles")+"\\PostgreSQL\\9.3\\bin\\pg_restore.exe\"";
        buscarRutaRespaldo();
        
        //respaldo=new File(ruta_respaldo+"\\Backup"+formateador.format(Calendar.getInstance().getTime()));
        if (!new File(ruta_postgresBackup).exists()) {
            ruta_postgresBackup = "\""+System.getenv("ProgramFiles")+" (x86)\\PostgreSQL\\9.3\\bin\\pg_dump.exe\"";
            ruta_postgresRestore = "\""+System.getenv("ProgramFiles")+" (x86)\\PostgreSQL\\9.3\\bin\\pg_restore.exe\"";
        }
    }

    public void crearBatBackup() {
        //getClass().getResource("\\Backup\\Temp.bat");
        archivo = new File("Temp.bat");
        
        //archivo = new File(rutaB);
        
        System.out.println(archivo.getAbsoluteFile());
        //Escritura
        try {
            FileWriter w = new FileWriter(archivo);
            BufferedWriter bw = new BufferedWriter(w);
            PrintWriter escritor = new PrintWriter(bw);
            escritor.write("set PGPASSWORD=palmera\n");
            escritor.append(ruta_postgresBackup + " -U postgres -h localhost -c -C -F c -f " + this.ruta_respaldo + "\n exit");
            escritor.close();
            bw.close();
            Runtime.getRuntime().exec("cmd /c start "+archivo.getAbsoluteFile());
        } catch (IOException e) {
        };
    }

    public void backup() throws FileNotFoundException, IOException {
        this.Colocar_Destino();
    }

    public void Colocar_Destino() throws IOException {
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "Archivo", "backup");
        
        JFileChooser seleccionador = new JFileChooser() {
            @Override
            public void approveSelection() {
                File f = getSelectedFile();
                if (f.exists() && getDialogType() == SAVE_DIALOG) {
                    int result = JOptionPane.showConfirmDialog(this, "Ya existe un archivo con ese nombre.\n¿Desea sobreescribirlo?", "Archivo Existente", JOptionPane.YES_NO_OPTION);
                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            super.approveSelection();
                            return;
                        case JOptionPane.NO_OPTION:
                            return;
                        case JOptionPane.CLOSED_OPTION:
                            return;
                    }
                }
                else{
                    super.approveSelection();
                }
            }
        };
        seleccionador.setFileFilter(filter);
        seleccionador.setDialogTitle("Seleccione Donde guardar el archivo de Backup");
        
        ruta_respaldo=ruta_respaldo+"\\Backups\\Backup"+ formateador.format(Calendar.getInstance().getTime()) + ".backup";
        respaldo = new File(this.ruta_respaldo);
        seleccionador.setCurrentDirectory(new File("Backups"));
        seleccionador.setSelectedFile(respaldo);
        int result = seleccionador.showSaveDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            respaldo = seleccionador.getSelectedFile();
            this.ruta_respaldo = "\"" + this.respaldo.getAbsolutePath() + "\"";
            crearBatBackup();
        }
    }

    public boolean buscarDestino() throws IOException {
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "Archivo", "backup");
        JFileChooser seleccionador = new JFileChooser();
        File archivoT = new File("Backups");
        seleccionador.setCurrentDirectory(archivoT);
        seleccionador.setFileFilter(filter);
        seleccionador.setDialogTitle("Seleccione el fichero de backup que desea recuperar");
        ruta_respaldo=ruta_respaldo+"\\Backups";
        seleccionador.setCurrentDirectory(new File(ruta_respaldo));
        int result = seleccionador.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            respaldo = seleccionador.getSelectedFile();
            this.ruta_respaldo = "\"" + this.respaldo.getAbsolutePath() + "\"";
            return true;
        } else {
            return false;
        }
    }

    public void restore() throws IOException, InterruptedException {
        
        int opcion = JOptionPane.showConfirmDialog(null, "¿Esta seguro que desea restaurar la base de datos a un estado anterior?\n"
                + "Tenga en cuenta que no podrá cancelar esta opción, si aún así desea continuar,"
                + "\nle sugerimos que realice un backup del estado actual.", "Confirmación de restauración de la Base de Datos", JOptionPane.YES_NO_OPTION);
        if (opcion == JOptionPane.YES_OPTION) {
            if(this.buscarDestino()){
                System.out.println("restauro con: "+this.ruta_respaldo);
                crearBatRestore();    
                //new ProcessBuilder("TempR.bat" ).start().waitFor();
            }
            
        }
        
    }

    public void crearBatRestore() {
        archivo = new File("TempR.bat");
        try {
            FileWriter w = new FileWriter(archivo);
            BufferedWriter bw = new BufferedWriter(w);
            PrintWriter escritor = new PrintWriter(bw);
            escritor.write("set PGPASSWORD=palmera\n");//escribimos en el archivo
            escritor.append(ruta_postgresRestore + " -i -h localhost -p 5432 -U postgres -d postgres -c -v " + this.ruta_respaldo + "\nexit");
            escritor.close();
            bw.close();
            Runtime.getRuntime().exec("cmd /c start "+archivo.getAbsolutePath());
            JOptionPane.showMessageDialog(null, "El programa ha finalizado la restauración y se cerrará.");
            System.exit(0);
        } catch (IOException e) {
        };
    }
}
